Android 自定义ScrollView ListView 体验各种纵向滑动的需求 |
您所在的位置:网站首页 › android recyclerview滑动监听 › Android 自定义ScrollView ListView 体验各种纵向滑动的需求 |
分类: 【android 进阶之路】2014-08-31 12:59 6190人阅读 评论(10) 举报Android自定义ScrollView纵向拖动 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509,本文出自【张鸿洋的博客】 1、概述群里的一个哥们有个需求是这样的:问题;主要功能就是:1、循环的一个滑动;2、每次滑动结束,保持每个Item的完整。然后我当时给他写了个Demo,所有代码都在Activity里面,后期看来其太恶心了,修改也不方便;貌似那哥们还因为那代码修改到12点,大大的赞一下这哥们的毅力,也深表歉意,今天特意把代码抽取成自定义的ScrollView,然后提供一些回调出来; 本博客首先介绍使用自定义的ScrollView解决上面的问题,然后自定义ListView实现每次拖动完成后保持每个Item的完整; 关于横向滑动可以参考: Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果 Android 自定义RecyclerView 实现真正的Gallery效果 横向和纵向很类似哈,一个改写HorizontalScrollView,一个是ScrollView;一个改写ListView,一个是RecyclerView;不多具体需求还是有出入的,大家如果有这方面需求可以借鉴。关于横向有同学问如何保证滑动结束实现单个Item完整,可以参考今天纵向的代码。 2、自定义ScrollView实现循环Item拖动现展示下效果图,然后讲解下原理,最后分析下代码~三部曲~ 1、效果图: 2、实现的原理a、根据用户提供的Adapter(主要就两个方法,getCount【决定多少个Item】,getView【每个Item的样子】),根据getCount我会在初始化时,在ScrollView内部LinearLayout中添加对应数量的Item,当然也会根据数量平分屏幕高度; b、监听onTouch方法,当用户触发ACTION_MOVE时,屏幕跟随用户手指上面移动,当达到顶部时,会动态为顶部添加一个Item,同时移除底部最后一个Item;用户滑动到达底部也一样,底部动态添加一个Item,顶部第一个移除;ScrollView内会始终维持用户指定数量+1个Item,为什么加1呢,因为拖动过程中最多会显示+1个Item(第一个一半,最后一个一半) c、监听ACTION_UP,判断如果当然显示小于半个,缩回去;大于半个则慢慢显示出完整的Item; 3、代码分析首先我们定义一个Adapter,用户给用户设置每个Item的样子以及个数;类似ListView的Adapter /** * 适配器 * @author zhy * */ public static abstract class Adapter { public abstract View getView(SingleItemScrollView parent, int pos); public abstract int getCount(); }构造方法中得到屏幕的高度 public SingleItemScrollView(Context context, AttributeSet attrs) { super(context, attrs); // 计算屏幕的高度 WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); mScreenHeight = outMetrics.heightPixels; mScreenHeight -= getStatusHeight(context); }onMeasure中对Item进行添加,以及设置高度 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //防止多次调用 if (!flag) { mContainer = (ViewGroup) getChildAt(0); //根据Adapter的方法,为容器添加Item if (mAdapter != null) { mItemCount = mAdapter.getCount(); mItemHeight = mScreenHeight / mItemCount; mContainer.removeAllViews(); for (int i = 0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |